package org.boot.fast.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * 通用类型转换工具类
 */
public class GenericConverter {

    private static final Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss") // 设置日期格式
            .create();

    /**
     * 将 List<Map<String, Object>> 转换为指定类型的 List
     *
     * @param mapList 源数据列表
     * @param targetClass 目标类型 Class
     * @param <T> 目标类型
     * @return 转换后的对象列表
     */
    public static <T> List<T> convertToTypedList(List<Map<String, Object>> mapList, Class<T> targetClass) {
        String json = gson.toJson(mapList);
        Type listType = TypeToken.getParameterized(List.class, targetClass).getType();
        return gson.fromJson(json, listType);
    }

    /**
     * 将 List<Map<String, Object>> 转换为指定类型的 List（支持复杂泛型）
     *
     * @param mapList 源数据列表
     * @param typeToken 目标类型的 TypeToken
     * @param <T> 目标类型
     * @return 转换后的对象列表
     */
    public static <T> List<T> convertToTypedList(List<Map<String, Object>> mapList, TypeToken<List<T>> typeToken) {
        String json = gson.toJson(mapList);
        return gson.fromJson(json, typeToken.getType());
    }

    /**
     * 将单个 Map<String, Object> 转换为指定类型的对象
     *
     * @param map 源数据 Map
     * @param targetClass 目标类型 Class
     * @param <T> 目标类型
     * @return 转换后的对象
     */
    public static <T> T convertToObject(Map<String, Object> map, Class<T> targetClass) {
        String json = gson.toJson(map);
        return gson.fromJson(json, targetClass);
    }

    /**
     * 带错误处理的转换方法
     *
     * @param mapList 源数据列表
     * @param targetClass 目标类型 Class
     * @param defaultValue 转换失败时的默认值
     * @param <T> 目标类型
     * @return 转换后的对象列表，失败时返回默认值
     */
    public static <T> List<T> convertToTypedListSafely(List<Map<String, Object>> mapList,
                                                       Class<T> targetClass,
                                                       List<T> defaultValue) {
        try {
            return convertToTypedList(mapList, targetClass);
        } catch (Exception e) {
            e.printStackTrace();
            return defaultValue;
        }
    }
}